package pe.com.cotelasa.scp.dominio.servicio.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.inject.Inject;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOCompraFacturacion;
import pe.com.cotelasa.scp.dao.IDAOLetraDeCambio;
import pe.com.cotelasa.scp.dao.IDAOVentaFacturacion;
import pe.com.cotelasa.scp.dominio.common.COLOR_ESTADO_VENTA;
import pe.com.cotelasa.scp.dominio.common.ESTADO_LETRA_DE_CAMBIO;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioLetraDeCambio;
import pe.com.cotelasa.scp.entidad.CompraFacturacion;
import pe.com.cotelasa.scp.entidad.DetalleLetra;
import pe.com.cotelasa.scp.entidad.Letra;
import pe.com.cotelasa.scp.entidad.VentaFacturacion;
import pe.com.cotelasa.seguridad.common.util.Constantes.EstadoRegistro;

@Service
@Transactional
public class ServicioLetraDeCambioImpl implements IServicioLetraDeCambio, Serializable {

	private static final long serialVersionUID = 3603640917702510988L;

	@Inject
	private IDAOLetraDeCambio daoLetraDeCambio;
	
	@Inject
	private IDAOCompraFacturacion daoCompraFacturacion;
	
	@Inject
	private IDAOVentaFacturacion daoVentaFacturacion;

	@Override
	public Letra obtenerLetraDeCambioPorNumero(String numeroLetra) throws ServiceException {
		try {
			return daoLetraDeCambio.obtenerLetraPorNumero(numeroLetra);
		} catch (DAOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public Collection<Letra> listarLetrasDeCambioActivas() throws ServiceException {
		try {
			return daoLetraDeCambio.listarActivos(Letra.class);
		} catch (DAOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public Collection<Letra> listarLetrasPorFiltro(Letra letra)
			throws ServiceException {
		try {
			return daoLetraDeCambio.obtenerBusquedaLetrasPorFiltros(letra);
		} catch (DAOException e) {
			throw new ServiceException(e);
		} 
	}
	
	@Override
	public void guardarLetraDeCambio(Letra letra) throws ServiceException {
		try {
			daoLetraDeCambio.insertar(letra);
		}catch(DAOException e){
			throw new ServiceException(e);
		}	
	}
	
	@Override
	public void anularLetra(Letra letra) throws ServiceException {
		try {
			daoLetraDeCambio.actualizar(letra);
		}catch(DAOException e){
			throw new ServiceException(e);
		}
	}
	
	@Override
	public void cancelarLetraDeCambio(Letra letra) throws ServiceException {
		try {
			daoLetraDeCambio.actualizar(letra);
			Collection<DetalleLetra> listaDetalleLetra = letra.getDetalleLetraCollection();
			CompraFacturacion compraFacturacion = new CompraFacturacion();
			VentaFacturacion ventaFacturacion = new VentaFacturacion();
			List<CompraFacturacion> listaCompraFacturacions = new ArrayList<CompraFacturacion>();
			List<VentaFacturacion> listaVentaFacturacions = new ArrayList<VentaFacturacion>();
			for (DetalleLetra detalleLetra : listaDetalleLetra) {
				if(detalleLetra.getIdCompraFacturacion()!=null){
					compraFacturacion.setId(detalleLetra.getIdCompraFacturacion().getId());
					compraFacturacion.setEstadoCancelacion(COLOR_ESTADO_VENTA.PAGADA.getEstado());
					listaCompraFacturacions.add(compraFacturacion);
				}else{
					ventaFacturacion.setCoddocventa(detalleLetra.getIdVentaFacturacion().getCoddocventa());
					ventaFacturacion.setEstado(COLOR_ESTADO_VENTA.PAGADA.getEstado());
					listaVentaFacturacions.add(ventaFacturacion);
				}
				
			}
			if(!listaCompraFacturacions.isEmpty()){
				daoCompraFacturacion.actualizarFacturasPagadas(listaCompraFacturacions);
			}
			if(!listaVentaFacturacions.isEmpty()){
				daoVentaFacturacion.actualizarFacturasPagadas(listaVentaFacturacions);
			}
		} catch (Exception e) {
			throw new ServiceException(e);
		}
	}
	
	
	@Override
	public Letra obtenerLetradeCambio(Integer idLetra) throws ServiceException {
		try {
			return daoLetraDeCambio.obtenerEntidadPorId(Letra.class,idLetra);
		} catch (Exception e) {
			throw new ServiceException(e);
		}
	}
	
	@Override
	public void actualizarFechaVencimientoLetra(Letra letra) throws ServiceException {
		try {
			Letra letraActualizar = daoLetraDeCambio.obtenerEntidadPorId(Letra.class,letra.getId());
			letraActualizar.setFecVencimiento(letra.getFecVencimiento());
			letraActualizar.setFecModificacion(letra.getFecModificacion());
			letraActualizar.setUsrModificacion(letra.getUsrModificacion());
			daoLetraDeCambio.actualizar(letraActualizar);
		} catch (Exception e) {
			throw new ServiceException(e);
		}
		
	}
}